/*
 * =====================================================================================
 *
 *       Filename:  functionc.h
 *
 *    Description:  libpcap接口笔记
 *
 *        Version:  1.0
 *        Created:  2020年02月25日 15时18分00秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  YOUR NAME (), 
 *   Organization:  
 *
 * =====================================================================================
 */

#include <pcap.h>

/*
 * pcap_open_live():
 * 作用:获取用于pcap_t的句柄
 * 参数:
 * @device:网络接口名称,如eth0
 * @snaplen:捕获数据包的最大字节数
 * @promisc:网络接口是否设置混杂模式
 * @to_ms:制定超时时间
 * @ebuf:本函数出错时错误消息
 */
pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms. char *ebuf);


/*
 * pcap_open_offline():
 * 作用: 打开保存的抓包文件:用于读取
 * 参数说明:
 * @file_name:抓包文件路径
 * @ebuf:本函数出错时的错误消息
 */
pcap_t *pcap_open_offline(char *file_name, char *ebuf);


/*
 * pcap_dump_open():
 * 作用:打开抓包文件:用于写入
 * @pcap:
 * @file_name:
 */
pcap_dumper_t *pcap_dump_open(pcap_t *pcap, char *file_name);


/*
 * pcap_lookupdev():
 * 作用:获取可悲pcap_open_alive()或者pcap_lookupnet()函数调用的网络接口名称
 */
char *pcap_lookupdev(char *errbuf);

/*
 * 作用:获取制定网络接口的网络号(IP地址???)和掩码
 */
int pcap_lookupnet(char *device, bpf_u_int32 *netp, bpf_u_int32 *maskp, char *ebuf);


/*
 * 捕获并处理数据包
 * @cnt:指定函数返回前所处理数据包的最大值
 *   -1: 表示在一个缓冲区中处理所有数据包
 *    0: 表示处理所有数据包,直到产生错误(读取到EOF,读取超时,)
 * @cb:处理数据包的回调函数
 * @user:用于自定义数据接口，传给cb使用
 */
int pcap_dispatch(pcap_t *pcap, int cnt, pcap_handler cb, u_char *user);


/*
 * 同pcap_dispatch()
 * 读取超时不会返回
 */
int pcap_loop(pcap_t *pcap, int cnt, pcap_handler cb, u_char *user);


/*
 * 可作为pcap_dispatch的回调函数
 */
int pcap_dump(u_char *user, struct pcap_pkthdr *h, u_char *sp);


/*
 * 将str字符串中的过滤条件编译到过滤程序中
 * @fp:在此函数中被赋值
 * @optimize:控制结果代码的优化
 * @netmask:制定本地网络的网络掩码
 */
int pcap_compile(pcap_t *pcap, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask);


/*
 * 给pcap制定一个过滤条件fp
 */
int pcap_setfilter(pcap_t *pcap, struct bpf_program *fp);


/* 
 * 返回下一个数据包的u_char指针
 */
u_char *pcap_next(pcap_t *pcap, struct pcap_pkthdr *h);


/*
 * 返回数据链路层的类型:如DLT_EN10MB
 */
int pcap_datalink(pcap_t *pcap);


int pcap_snapshot(pcap_t *pcap);


int pcap_is_swapped(pcap_t *pcap);


int pcap_major_version(pcap_t *pcap);


int pcap_minor_version(pcap_t *pcap);


int pcap_stats(pcap_t *pcap, struct pcap_stat *ps);


FILE *pcap_file(pcap_t *pcap);

int *pcap_fileno(pcap_t *pcap);

void pcap_perror(pcap_t *pcap, char *prefix);

char *pcap_geterr(pcap_t *pcap);

char *pcap_strerror(int error);

void pcap_close(pcap_t *pcap);

void pcap_dump_close(pcap_dumper_t *p);

